数据仓库规范全解
The following article is from 数仓与大数据 Author otw30
傅一平评语:
三流水平的去码代码,二流水平的去做架构,一流水平的人去写规范,建章立制的人总是牛逼的。
很久没看到这么有逻辑而清晰的数仓文章了,如果你知晓数仓却没做过梳理,读这篇文章可以让你把知识点串起来,有助于巩固自己的知识体系;如果你是个新手,那么按图索骥就是第一步要做的事情,这样可以确保你做数仓有一个较高的起点,在做的过程中你会体会到规范的力量。本文的主要内容包括七个部分:
1、为什么要有规范?
2、规范该怎么落地?
3、数仓规范有哪些?
4、设计规范
5、流程规范
6、质量管控规范
推荐读一读。
接到了一个需求,不知道该从那张表出数,表A貌似可以,表B好像也行。问了同事甲,他说他每次都是从C表出的。对着三张表探索了好久,发现谁跟谁都对不上,算了吧,我从源头再算一次吧,结果又变出来一张表D。 数据库里几千张表,好像我用到的也就那么十几张,其它的都是干啥用的呢,问了一圈没有人知道,删掉吧?更没有人敢动。 有个流程报错了,领导让我去看一下,点进去后,屎一样的代码完全看不懂,另外,找了好久死活找不到上游依赖。 有位同事要离职,他负责的那部分内容,换了一个人接手,累死累活好多天依然捋不出个所以然,一气之下又走了一个人。
规范制定
规范讨论
规范推行
数据模型应该有统一归口,比如数据架构师,架构师定期检查模型是否合理合规。 组织数据开发人员,定期 Review 每个人的代码,但不必针对个人更不要上纲上线,目的是通过对比和讨论让大家明白什么样的才是好代码,最终使“写好代码”成为基本素养。没有条件的话就有 Leader 负责定期检查,有问题的私下指出来帮助组员逐渐规范。 入职新人,熟读规范后,还应该安排专人指导,是合规性检查的重点关注对象。
短期坚持还好,但长期的专注很难。 有时候人忙起来了,快速产出和规范该选哪个?代码 Review 还要不要做?新建的表要不要找数据架构师审核? 数据建模最好是有专门的人或者小团队去做,其他人使用,这往往会影响整体效率,所以通常都是谁用谁建,但撒出去后再想靠人去检查合规性,真的就太难了。
规范完善
如果你是管理者,就要定期的抽查团队成员的工作产出、发现问题及时更正、对入职新人前期的重点关注等等。 如果你是一线开发,应该对自己有所约束。如果团队整体混乱,管理者对规范又不太重视,那么调整心态、适应环境就好,切不可因此与同事发生冲突,圈子很小大家以和为贵嘛。
为了让大家了解到数仓规范全貌,特意花大力气整理出以上分类。欢迎大家推广普及运用。由于只是一家之言,大家如有不同的见解、更好的方案或者有可以再补充的,欢迎拉到文章底部,加我微信,大家共同研究。这里,我把数仓规范,一共分为四大类:设计规范、流程规范、质量管理规范、安全规范。
设计规范,又划分为四部分:数据模型设计、命名规范、指标体系设计、词根库。 流程规范,主要是从数仓管理的角度,对数仓场景下的各种流程进行约束。核心流程一共提炼出来五类:需求提交、模型设计、ETL开发、前端开发、上线流程。 质量管控规范,之所以单独列出来,是因为数据质量,跟模型设计一样,对数仓建设的成败关系极大。试想下,一个数据质量都无法保证的数据仓库,有谁会用? 数据质量规范,主要是从数据流动的角度分为三类:源端管控、数仓管理、应用管控。 安全规范,随着国家、社会、企业对数据的越来越重视,另一方面随着互联网的普及使得个人隐私变的越来越难以保证,数据泄露时有发生。数据安全对于数据仓库的重要程度急速提升,所以安全规范被单列了出来。从大的层面上安全规范分为三类:网络安全、账号安全、数据安全。
说明
分层设计是数据架构设计的产出之一,在模型设计环节做为强制规范遵守。
分层规范
ODS
贴源层,原始数据不做变化或者仅做最简单的补全后存入。 数据域划分,依据是数据源。
DWD
对数据源做清洗、转换、补全、编码转换后加载到明细数据层。 数据域划分,依据参考下边的纵向分域。
DWS
汇总数据层+主题宽表。 数据域划分,依据参考下边的纵向分域。
ADS
应用层,面向最终应用。 主题域划分,依据是最终应用。生命周期也与应用同步。
层次调用规范
禁止反向调用 ODS 只能被 DWD 调用。 DWD 可以被 DWS 和 ADS 调用。 DWS 只能被 ADS 调用。 数据应用可以调用 DWD、DWS、ADS,但建议优先考虑使用汇总度高的数据。 ODS->DWD->DWS>ADS ODS->DWD->ADS
定义
主题域通常是联系较为紧密的数据主题的集合,方便寻找和使用数据。
基本原则
高内聚、低耦合。 数量不能太多。建议不超过十个。 必须保持稳定。既能涵盖当 前所有的业务需求,又能在新业务进入时无影响地被包含进已有的数据域中或扩展新的数据域。 需要结合团队和业务的实际情况,比如业务是否稳定、团队成员建模水平等。 适度的抽象。太低不好适应变化,太高不易于理解使用。
分类
数据/业务主题域
依据业务流程划分,实现相对容易。
分析主体域
面向分析场景,实现较难,对业务理解、抽象能力等要求高。
划分依据
按照业务或业务过程划分:比如一个靠销售广告位置的门户网站主题域可能会有广告域,客户域等,而广告域可能就会有广告的库存,销售分析、内部投放分析等主题。 根据需求方划分:比如需求方为财务部,就可以设定对应的财务主题域,而财务主题域里面可能就会有员工工资分析,投资回报比分析等主题。 按照功能或应用划分:比如微信中的朋友圈数据域、群聊数据域等,而朋友圈数据域可能就会有用户动态信息主题、广告主题等。 按照部门划分:比如可能会有运营域、技术域等,运营域中可能会有工资支出分析、活动宣传效果分析等主题。
高内聚和低耦合 核心模型与扩展模型分离
公共处理逻辑下沉及单一 成本与性能平衡
数据可回滚 一致性
命名清晰、可理解
维表:创建时间、更新时间 事实表:ETL 日期、更新时间
表、字段的备注信息,必须言简意赅,在描述清楚的前提下尽量简洁。 字段类型的约束:比如字符串用 String,数值用 Int,年月日都用 String 比如 yyyyMMdd 等。
采用蛇形命名法,即采用一个下划线分隔词根。 优先使用词根中已有关键字(数仓标准配置中的词根管理),定期 Review 新增命名的不合理性。
禁止采用非标准的缩写。 命名一律采用小写,只能以字母开头。
命名不宜过长。
表
分层-分域-分词根-分时间周期 正式表,所在层级名称+数据域+表描述+时间周期或加载策略,如增量、快照、拉链/小时、日、周、月、季、年 中间表,对应正式表+_mid+阿拉伯数字 临时表,z+创建者姓名检查+表名
视图
参照表命名规范+_v
字段
优先从词根中取,多次出现的要增加到词根库
任务
与目标表名相同
指标
原子指标
业务修饰词 + 词根
衍生指标
原子指标+时间周期(可选)
派生指标
一个原子指标+多个修饰词(可选)+时间周期
脚本是否有备注、复杂计算逻辑是否有注释释。
任务是否支持多次重跑而输出不变,不能有 insert into 语句。
分区表是否使用分区键过滤并且有有效裁剪。 外连接的过逑条件是否使用正确,例如在左连接的 where 语句存在右表的过滤条件。 关联小表,是否使用/*+ map join * /。 不允许引用别的计算任务临时表。
原则上不允许存在一个任务更新多个目标表。
是否存在笛卡尔积。
禁止在代码里面使用 drop、create、rename 等 DDL 语句。
使用动态分区时,有没有检查分区键值为 NULL 的情况。
对于重要的任务 DQC 质量监控规则是否配置,严禁裸奔。
代码中有没有进行适当的规避数据倾斜语句。
指标层级划分方式
按分析主题
一级分类 二级分类
按业务过程
一级分类 二级分类 三级分类
指标定义
内容
所属分类 指标类别 名称 描述 口径/算法 计量单位 适用维度 ...
原则
唯一性 可扩展 易理解
类别
原子指标(某一业务事件行为下的度量,不可再拆分的指标) 例如:订单金额 衍生指标(对原子指标进行四则运算) 派生指标(统计周期+统计粒度+业务限定+原子指标)例如:最近一天+新创建的+订单个数(阿里大数据之路对于派生指标的定义:派生指标=原子指标+时间周期修饰词+其它修饰词。唯一归属于某一个原子指标,继承原子指标的数据域)
说明:网上对于指标分类说法不统一,大家知道咋回事儿就行了。搜了一下阿里的大数据之路,没有衍生指标的概念。说法一:衍生指标=派生指标。那么用我上边派生指标的定义即可。说法二:衍生指标是对原子指标进行四则运算得到的。那么衍生指标就是原子指标增加减少几个修饰词或者时间周期扩大缩小后得到的。所以感觉衍生指标有点鸡肋搞不好就变成原子/派生指标了。
指标管理流程
指标新增申请 初审:明确指标口径,检查指标库是否包含 二审:审核指标定义需要的各项元素是否准确完备 入指标库
定义
把可能会多次用到的短语,集中命名,保证全局范围内的命名含义一致性。
内容
所属分类 名称 英文简称 数据类型 备注
分类
普通词根:描述事物的最小单元体,如:交易-trade。 专有词根:具备约定成俗或行业专属的描述体,如:美元-USD。
公共字段
公共字段=词根组合+其它关键词 公共字段放入词根库不太严谨,但字段命名时候可以直接取用,降低了命名不一致的风险,所以工具化不太完善的公司推荐这样使用。
提出需求
需求提出人:以文档的形式提出需求(写清楚需求内容、交付物、期望交付日期),发给数仓 Leader。
沟通需求
数仓 Leader 将需求分配给相关人承接,同时协商好实际交付日期。 如果需求提出人的交付日期与数仓 Leader 的交付日期不一致,双方需要进一步协商一致。
开发交付
需求承接人,需按照协商一致的交付日期,按期交付。
数据调研、业务调研、需求调研 数据建模
总体思路
根据已有的分层分域,分治、各个击破。
多种方式结合使用
确定业务过程->声明粒度->确定维度->确定事实 业务建模->逻辑建模->物理建模 构建总线矩阵 构建指标体系
评审
除了模型设计,还需要拉上必要的开发、业务、分析师、产品经理、数仓运维等。
上线、迭代、完善
需求理解 数据探查
程序开发 流程依赖 配置调度
接口规范 代码部署规范
申请
上线时间 上线功能范围 对其它模块、上下游依赖的影响 上线支持团队清单 上线详细操作步骤 测试报告 回滚方案
评审
代码 Review 上下游影响分析
上线
上线支持团队就绪 严格按照上线操作步骤执行 失败回滚
源端变动,必须提前通知数仓侧。 有条件的话,使用工具监控源端重点内容的变动。
对已有规范没有贯彻的给予警告、处罚:建模规范、开发规范、上线规范 使用工具加强数据质量监控,发现问题及时通知、告警。
建立数据质量解决机制,责任到人。 定期复盘
重要常见问题入告警规则 源端数据质量问题,协调源端解决 存储模型、ETL开发、上线流程等引起的问题,需要制定合适的解决方案
统一指标定义 统一指标口径 统一外部数据输出归口
内外网隔离,外网环境访问内网需要登录 VPN 核心数据存储、功能模块,只开放给特定的少部分人。
每个人分配独立的账号,赋予合理的权限,禁止相互借用。 数据库、大数据组件开通多个角色账号。比如只读、部分表读写、管理员等。当然还可以按实际需求细分。Hive、ODPS 的话也是可以实现单人单号的。 服务器登录。也是单人单号 公司内部应用账号。单人单号。
至少做到表级别的权限控制,实在不行就分库。 ODS 层不对外开放,只对 ODS-DWD 层相关部分开发人员可见。 特别敏感数据,如用户年龄、号码、身份证好、地址等,应该放到专门的数据库里,数仓主库只存放用户 ID 和其它必须字段。例如年龄应该脱敏成年龄区间或开发特定的 UDF 转化函数。
为什么是API而不是文件,对于数据中台的开放如此重要?by 傅一平
点击左下角“阅读原文”查看更多精彩文章,公众号推送规则变了,如果您想及时收到推送,麻烦右下角点个在看或者把本号置顶!